package com.huaxin.dss2.util;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.huaxin.dss2.data.NewSmallStation.SDataValue;
import com.huaxin.dss2.data.bean.BoxState;
import com.huaxin.dss2.data.bean.DataValue;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @author : luqing
 * @date : 2018/7/17 17:27
 */
public final class ScheduledValue {

    /**
     * 所有从fbox厂家推送的数据
     * key: stationCode
     * value: SDataValue {@link SDataValue}
     */
    public final static Map<String, SDataValue> DATA_VALUE_MAP = Maps.newConcurrentMap();

    /**
     * 有小数位的整数数据
     * key: stationCode
     * value: 小数位长度
     */
    public final static Map<String, Integer> VALUE_FRAC_DIGITS_MAP = Maps.newHashMap();

    /**
     * 有小数位的浮点型数据
     * key: stationCode
     * value: 小数位长度
     */
    public final static Map<String, Integer> FLOAT_FRAC_DIGITS_MAP = Maps.newHashMap();

    /**
     * 嘉靖特殊指标map
     * key : stationCode
     * value : dataValue(dataCode=stationCode_0_iswarn,dataValue=0d)
     */
    public final static Map<String, DataValue> DATA_IS_WARN_MAP = Maps.newHashMap();

    /**
     * 站点集合
     */
    public static List<String> STATION_CODE_LIST = Lists.newArrayList();

    /**
     * 用于存放状态改变的list
     * 在推送状态时，将IO操作单独进行执行
     */
    public final static ConcurrentLinkedQueue<BoxState> F_BOX_STATE_QUEUE = new ConcurrentLinkedQueue<>();

    /**
     * 主动开启监听是否完成，线程安全
     * 主要解决问题，被动开点推送数据过慢，需要主动推送数据
     * 主动开点和被动开点不能同时进行，否则数据还是推送过慢
     * 所以加入是否完成主动点，当主动开点完成时，才进行被动开点(用于重连signalR)
     */
    private static AtomicBoolean iFinishStart = new AtomicBoolean(false);


    /**
     * 获取是否已经完成开点
     * @return false:未完成 true:已完成
     */
    public static boolean getIFinishStart() {
        return iFinishStart.get();
    }

    /**
     * 当主动开点结束时开点改变状态
     */
    public static void changeIFinishStart() {
        ScheduledValue.iFinishStart.set(true);
    }
}
